home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / ROBOTS.M < prev    next >
Encoding:
Text File  |  1989-03-10  |  8.2 KB  |  282 lines

  1. MODULE Roboter;
  2.  
  3. IMPORT RandomGen, TOSIO, InOut;
  4.  
  5. (*
  6.   Beispielprogramm für Soft~wave Modula-2
  7.   von Rolf Hänisch, Katzbachstr. 6, 1000 Berlin 61
  8.   
  9.   Anpassung auf Megamax M-2 am 28.5.88 von Thomas Tempelmann
  10.   - GEMDOS.Crawcin -> InOut.Read
  11.   - XBIOS.Random -> RandomGen.RandomCard
  12.   - Tastenbelegung auf Zehnerblock
  13.   - Prozeduren vertauscht wg. 1-Pass
  14.   - 'Setze'-Aufruf in 'SpielStand' erzeugte Range Error -> GotoXY verwendet
  15.   - 'NeuerPlatz': 'Random'-Aufruf erzeugte Range Error -> "+1" entfernt
  16.   - TOSIO importiert
  17. *)
  18.  
  19. CONST
  20.      ICH = '@';
  21.      ROB = '=';
  22.      BLECH = '#';
  23.      MAMPF = '*';
  24.      LEER = ' ';
  25.      ESC = 33C;
  26.  
  27. TYPE
  28.         SHORTINT = INTEGER;
  29.         SHORTCARD= CARDINAL;
  30.         
  31.         Cardinal = LONGCARD;
  32.         
  33.      roboter = RECORD
  34.                lebend: BOOLEAN;
  35.                X, Y: SHORTINT;
  36.                END;
  37.  
  38. CONST
  39.      MAXROBOTER = 300;
  40. VAR
  41.      RoboterListe : ARRAY [1..MAXROBOTER] OF roboter;
  42.  
  43.      RoboterZahl,
  44.      LebendeRoboter,
  45.      FreieTeleports,
  46.      TeleportsProEbenen,
  47.  
  48.      Ebene               : SHORTINT;
  49.  
  50.      MeinX,
  51.      MeinY: SHORTINT;
  52.  
  53. CONST
  54.      MAXZEILE = 23;
  55.      MAXSPALTE = 79;
  56.  
  57. VAR
  58.      Besetzt : ARRAY [0..MAXSPALTE],[0..MAXZEILE] OF CHAR;
  59.      Gegessen : BOOLEAN;
  60.      Warten: BOOLEAN;
  61.      FeieTeleports,
  62.      TeleportsProEbene: SHORTINT;
  63.  
  64. PROCEDURE Random (n: Cardinal): CARDINAL;
  65.   BEGIN
  66.     RETURN RandomGen.RandomCard (0,SHORT(n))
  67.   END Random;
  68.  
  69. PROCEDURE ZeichneBildSchirm;
  70. VAR
  71.      i, j: SHORTCARD;
  72. BEGIN
  73.      (* Bildschirm loeschen *)
  74.      InOut.Write (ESC);
  75.      InOut.Write ('E');
  76.      (* Karte Loeschen *)
  77.      FOR i := 0 TO MAXSPALTE DO
  78.           FOR j := 0 TO MAXZEILE DO
  79.                Besetzt [i][j] := ' ';
  80.                END;
  81.           END;
  82. END ZeichneBildSchirm;
  83.  
  84. PROCEDURE NeuerPlatz (VAR x, y: SHORTINT): CHAR;
  85. BEGIN
  86.      x := Random (MAXSPALTE);
  87.      y := Random (MAXZEILE);
  88.      RETURN Besetzt [x][y];
  89. END NeuerPlatz;
  90.  
  91. PROCEDURE FreierPlatz (z: CHAR; VAR x, y: SHORTINT);
  92. BEGIN
  93.      REPEAT
  94.      UNTIL NeuerPlatz (x, y) = ' ';
  95.      Besetzt [x][y] := z;
  96. END FreierPlatz;
  97.  
  98. PROCEDURE Setze (z: CHAR; x, y: SHORTCARD);
  99. BEGIN
  100.      Besetzt [x, y] := z;
  101.      InOut.Write (ESC);
  102.      InOut.Write ('Y');
  103.      InOut.Write (CHR (ORD (' ') + y));
  104.      InOut.Write (CHR (ORD (' ') + x));
  105.      InOut.Write (z);
  106. END Setze;
  107.  
  108. PROCEDURE SetzeRoboter;
  109. VAR
  110.      i, x, y: SHORTINT;
  111. BEGIN
  112.      FOR i := 1 TO RoboterZahl DO
  113.           FreierPlatz (ROB, x, y);
  114.           WITH RoboterListe [i] DO
  115.                X := x;
  116.                Y := y;
  117.                lebend := TRUE;
  118.                END (*WITH*);
  119.           Setze (ROB, x, y);
  120.           END (*FOR*);
  121. END SetzeRoboter;
  122.  
  123. PROCEDURE NaechsteBewegung;
  124. VAR
  125.      c: CHAR;
  126.      x, y: SHORTINT;
  127.      Bewegt, Weiter: BOOLEAN;
  128. BEGIN
  129.      Bewegt := FALSE;
  130.      REPEAT
  131.           REPEAT
  132.                Weiter := TRUE;
  133.                IF Warten THEN c := '.'
  134.                ELSE InOut.Read (c);
  135.                END;
  136.                CASE c OF
  137.                     | '7': x := -1; y := -1;
  138.                     | '9': x :=  1; y := -1;
  139.                     | '1': x := -1; y :=  1;
  140.                     | '3': x :=  1; y :=  1;
  141.                     | '4': x := -1; y :=  0;
  142.                     | '2': x :=  0; y :=  1;
  143.                     | '8': x :=  0; y := -1;
  144.                     | '6': x :=  1; y :=  0;
  145.                     | '5': x :=  0; y :=  0;
  146.                     | 'q', ESC: HALT;
  147.                     | '.': x := 0; y := 0; Warten := TRUE;
  148.                     | '0':
  149.                          Weiter := FALSE;
  150.                          Setze (LEER, MeinX, MeinY);
  151.                          IF FreieTeleports > 0
  152.                          THEN DEC (FreieTeleports);
  153.                               REPEAT
  154.                               UNTIL NeuerPlatz (MeinX, MeinY) = LEER;
  155.                               Setze (ICH, MeinX, MeinY);
  156.                          ELSE IF NeuerPlatz (MeinX, MeinY) = LEER
  157.                               THEN Setze (ICH, MeinX, MeinY);
  158.                               ELSE Setze (MAMPF, MeinX, MeinY);
  159.                                    Gegessen := TRUE;
  160.                                    Weiter := TRUE;
  161.                                    END;
  162.                               END;
  163.                     END (*CASE*);
  164.                UNTIL Weiter;
  165.           IF ((MeinX + x) < 0) OR
  166.                ((MeinX + x) > MAXSPALTE) OR
  167.                ((MeinY + y) < 0) OR
  168.                ((MeinY + y) > MAXZEILE)
  169.           THEN InOut.Write (7C);
  170.           ELSE Setze (LEER, MeinX, MeinY);
  171.                Bewegt := TRUE;
  172.                END;
  173.      UNTIL Bewegt;
  174.      MeinX := MeinX + x;
  175.      MeinY := MeinY + y;
  176.      CASE Besetzt [MeinX, MeinY] OF
  177.           | ROB: Setze (MAMPF, MeinX, MeinY);
  178.                Gegessen := TRUE;
  179.           | BLECH:
  180.                IF ((MeinX + x) >= 0) AND
  181.                     ((MeinX + x) <= MAXSPALTE) AND
  182.                     ((MeinY + y) >= 0) AND
  183.                     ((MeinY + y) <= MAXZEILE) AND
  184.                     (Besetzt [MeinX + x, MeinY + y] = LEER)
  185.                THEN Setze (BLECH, MeinX + x, MeinY + y);
  186.                     Setze (ICH, MeinX, MeinY);
  187.                ELSE MeinX := MeinX - x;
  188.                     MeinY := MeinY - y;
  189.                     Setze (ICH, MeinX, MeinY);
  190.                     END;
  191.           | LEER:
  192.                Setze (ICH, MeinX, MeinY);
  193.                END (*CASE*);
  194. END NaechsteBewegung;
  195.  
  196. PROCEDURE RoboterBewegung;
  197. VAR
  198.      i, j: SHORTINT;
  199. BEGIN
  200.      FOR i := 1 TO RoboterZahl DO
  201.           WITH RoboterListe [i] DO
  202.                IF lebend
  203.                THEN Setze (' ', X, Y);
  204.                     IF X > MeinX THEN DEC (X) ELSIF X < MeinX THEN INC (X) END;
  205.                     IF Y > MeinY THEN DEC (Y) ELSIF Y < MeinY THEN INC (Y) END;
  206.                     END;
  207.                END;
  208.           END;
  209.      FOR i := 1 TO RoboterZahl DO
  210.           WITH RoboterListe [i] DO
  211.                IF lebend
  212.                THEN CASE Besetzt [X, Y] OF
  213.                     | LEER: Setze (ROB, X, Y);
  214.                     | ROB : Setze (BLECH, X, Y);
  215.                          lebend := FALSE;
  216.                          DEC (LebendeRoboter);
  217.                          FOR j := 1 TO RoboterZahl DO
  218.                               IF (X = RoboterListe [j].X)
  219.                               AND (Y = RoboterListe [j].Y)
  220.                               AND RoboterListe [j].lebend
  221.                               THEN RoboterListe [j].lebend := FALSE;
  222.                                    DEC (LebendeRoboter);
  223.                                    END;
  224.                               END;
  225.                     | BLECH:
  226.                          lebend := FALSE;
  227.                          DEC (LebendeRoboter);
  228.                     | ICH : Setze (MAMPF, X, Y);
  229.                          Gegessen := TRUE;
  230.                          END (*CASE*);
  231.                     END (*IF*);
  232.                END (*WITH*);
  233.           END (*FOR*);
  234. END RoboterBewegung;
  235.  
  236. PROCEDURE SpielStand;
  237. BEGIN
  238.      InOut.GotoXY (0, 24);
  239.      InOut.Write ('(');
  240.      InOut.WriteCard (FreieTeleports, 0);
  241.      InOut.WriteString (')  ');
  242.      InOut.WriteCard (Ebene, 0);
  243.      InOut.WriteString ('. Ebene; ');
  244.      InOut.WriteInt (LebendeRoboter, 0);
  245.      InOut.WriteString (' Roboter        ');
  246. END SpielStand;
  247.  
  248. PROCEDURE RoboterSpiel;
  249. VAR
  250.      x: CHAR;
  251. BEGIN
  252.      FreieTeleports := 0;
  253.      TeleportsProEbene := 1;
  254.      Ebene := 0;
  255.      RoboterZahl := 0;
  256.      Gegessen := FALSE;
  257.      REPEAT
  258.           Warten := FALSE;
  259.           FreieTeleports := FreieTeleports + TeleportsProEbene;
  260.           INC (RoboterZahl, 10);
  261.           LebendeRoboter := RoboterZahl;
  262.           INC (TeleportsProEbene);
  263.           INC (Ebene);
  264.           ZeichneBildSchirm;
  265.           SetzeRoboter;
  266.           FreierPlatz (ICH, MeinX, MeinY);
  267.           Setze (ICH, MeinX, MeinY);
  268.           LOOP
  269.                SpielStand;
  270.                IF LebendeRoboter = 0 THEN EXIT END;
  271.                NaechsteBewegung;
  272.                RoboterBewegung;
  273.                IF Gegessen THEN EXIT END;
  274.                END;
  275.           UNTIL Gegessen;
  276.      InOut.Read (x);
  277. END RoboterSpiel;
  278.  
  279. BEGIN
  280.      RoboterSpiel;
  281. END Roboter.